package com.boil.qz.safekavass.web.controller;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.model.LoginUser;
import com.boil.util.*;
import com.boil.util.office.ExcelUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by ChenYong on 2016-10-18.
 * <br>
 * 文件上传 Controller。
 */
@Controller("fileUploadController1")
@RequestMapping("/web")
public class FileUploadController extends OkBaseController {
    /**
     * 上传文件。
     *
     * @param model 模型
     * @param path  上传路径
     * @param file  文件
     * @return 结果 json
     * @throws Exception 抛出异常
     */
    @RequestMapping(method = RequestMethod.POST, value = "/file/upload.json")
    @ResponseBody
    public ResultVo uploadFile(Model model, String path, MultipartFile file) throws Exception {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取登录用户
        LoginUser loginUser = getLoginUser();

        // 上传路径为空
        if (StringUtils.isBlank(path)) {
            resultVo.setResultCode(Constants.UPLOAD_PATH_EMPTY);
            resultVo.setResultMsg(Constants.UPLOAD_PATH_EMPTY_MSG);

            // 上传路径非空
        } else {
            // 上传路径不正确
            if (!Constants.UPLOAD_DIR_NOTICE.equals(path) && //
                    !Constants.UPLOAD_DIR_LEARN_FILE.equals(path) && //
                    !Constants.UPLOAD_DIR_LEARN_DYM.equals(path) && //
                    !Constants.UPLOAD_DIR_HOME_ADVERT.equals(path) && //
                    !Constants.UPLOAD_DIR_REPORT.equals(path)) {
                resultVo.setResultCode(Constants.UPLOAD_PATH_ERROR);
                resultVo.setResultMsg(Constants.UPLOAD_PATH_ERROR_MSG);

                // 上传路径正确
            } else {
                // 上传文件为空
                if ((file == null) || file.isEmpty()) {
                    resultVo.setResultCode(Constants.UPLOAD_FILE_EMPTY);
                    resultVo.setResultMsg(Constants.UPLOAD_FILE_EMPTY_MSG);

                    // 上传文件非空
                } else {
                    // 文件的长度
                    long fileLength = file.getSize();
                    // 文件旧名称
                    String oldFileName = file.getOriginalFilename();
                    // 文件新名称
                    String newFileName = FileUtils.getNewFileName(file.getOriginalFilename());
                    // 文件后缀名
                    String fileSuffix = FileUtils.getFileSuffix(oldFileName);

                    // 文件的长度超过最大限制
                    if (fileLength > Constants.UPLOAD_FILE_MAX_SIZE_50M) {
                        resultVo.setResultCode(Constants.UPLOAD_FILE_EXCEED_MAX_SIZE);
                        resultVo.setResultMsg(Constants.UPLOAD_FILE_EXCEED_MAX_SIZE_MSG);

                        // 文件的长度未超过最大限制
                    } else {
                        // 获取上传文件的目录
                        File uploadFileDir = new File(request.getSession().getServletContext().getRealPath(String.format("%s/%s/", path, loginUser.getLoginid())));

                        // 如果目录不存在，则创建
                        if (!uploadFileDir.exists()) {
                            uploadFileDir.mkdirs();
                        }

                        // 创建上传文件的空文件
                        File uploadFile = new File(uploadFileDir, newFileName);

                        // 如果不存在，创建空文件
                        if (!uploadFile.exists()) {
                            uploadFile.createNewFile();
                        }

                        // 拷贝，上传完毕
                        file.transferTo(uploadFile);

                        Map<String, String> uploadFileMap = new HashMap<String, String>();
                        uploadFileMap.put("fileName", oldFileName);
                        uploadFileMap.put("filePath", String.format("%s/%s/%s", path, loginUser.getLoginid(), newFileName));

                        resultVo.setResultCode(Constants.SUCCESS);
                        resultVo.setResultMsg(Constants.UPLOAD_SUCCESS_MSG);
                        resultVo.setResult(uploadFileMap);

                        try {
                            // 上传文件的 html 目录路径
                            String htmlPath = request.getSession().getServletContext().getRealPath(String.format("%s/", Constants.UPLOAD_DIR_HTML));
                            // 上传文件的 html 目录
                            File htmlDir = new File(htmlPath);

                            // 如果不存在，则创建
                            if (!htmlDir.exists()) {
                                htmlDir.mkdir();
                            }

                            // 如果上传文件是 Word，直接转换为 HTML
                            if (Constants.SUFFIX_DOC.equalsIgnoreCase(fileSuffix) || Constants.SUFFIX_DOCX.equalsIgnoreCase(fileSuffix)) {
                                // html 图片目录
                                File htmlImageDir = new File(String.format("%s/%s/", htmlPath, Constants.IMAGE_STR));

                                // 如果不存在，则创建
                                if (!htmlImageDir.exists()) {
                                    htmlImageDir.mkdir();
                                }

                                if (Constants.SUFFIX_DOC.equalsIgnoreCase(fileSuffix)) {
                                    OfficeUtils.doc2Html(uploadFile, htmlPath);
                                } else if (Constants.SUFFIX_DOCX.equalsIgnoreCase(fileSuffix)) {
                                    OfficeUtils.docx2Html(uploadFile, htmlPath);
                                }

                                // 如果上传文件是 Excel，直接转换为 HTML
                            } else if (Constants.SUFFIX_XLS.equalsIgnoreCase(fileSuffix) || Constants.SUFFIX_XLSX.equalsIgnoreCase(fileSuffix)) {
                                if (Constants.SUFFIX_XLS.equalsIgnoreCase(fileSuffix)) {
                                    OfficeUtils.xls2Html(uploadFile, htmlPath);
                                } else if (Constants.SUFFIX_XLSX.equalsIgnoreCase(fileSuffix)) {
                                    ExcelUtils.xlsx2Html(uploadFile, htmlPath);
                                }
                            }
                        } catch (Exception e) {
                            log.error("账号：{}--->Word文件或Excel文件转换为Html文件时出现异常：{}", loginUser.getLoginid(), e);
                        }
                    }
                }
            }
        }

        return resultVo;
    }
}